我的Bilibili频道:香芋派Taro
我的个人博客:taropie0224.github.io(阅读体验更佳)
我的公众号:香芋派的烘焙坊
我的音频技术交流群:1136403177
我的个人微信:JazzyTaroPie

https://leetcode.cn/problems/3sum-closest/

题解and思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end()); //首先排序
int ans = nums[0] + nums[1] + nums[2]; //初始化ans为前三个数之和
//进入循环,边界条件为nums的长度
for(int i = 0; i < nums.size(); i++) {
//定义双指针,分别指向开始和最后
//因为已经排序完成,start不为i+1的话会有重复情况
int start = i+1, end = nums.size() - 1;
while(start < end) { //开始双指针的向中间逼近
int sum = nums[start] + nums[end] + nums[i]; //定义sum为当前i位置与start和end三处的和
if(abs(target - sum) < abs(target - ans)) //如果此时更接近sum
ans = sum; //把ans替换为sum
if(sum > target) //如果此时的sum大于结果,说明应当减小,end指针前移
end--;
else if(sum < target) //如果此时的sum小于结果,说明应当增大,start指针后移
start++;
else //剩下的情况只可能是找到了恰好符合target的sum,直接返回ans或target即可
return ans;
}
}
return ans;
}
};